package Demo1;

import java.util.Arrays;

public class MyArrayList {
    private int[] elems;
    private int usedSize;//元素个数
    final static int DEFAULT_CAPACITY = 10;//默认容量


    public MyArrayList(int capacity) {
        this.elems = new int[capacity];
    }

    public MyArrayList(int[] arr){
        this.usedSize = arr.length;
        this.elems = Arrays.copyOf(arr, Math.max(DEFAULT_CAPACITY, usedSize));//确保插入时有空间
    }

//    判断线性表是否已满
    public boolean isFull(){
        return elems.length == usedSize;
    }

//    打印
    public void display(){
        for (int i = 0; i < usedSize; i++) {
            System.out.print(elems[i]+" ");
        }
        System.out.println();
    }

    //    有序插入 元素x
    public void insert(int x){
        if (isFull()){
//            数组已满 要扩容
            elems = Arrays.copyOf(elems,elems.length * 2);//二倍扩容
        }

        int i = usedSize - 1;
        while (i >= 0 && elems[i] > x) {
            elems[i + 1] = elems[i]; // 向后移动元素
            i--;
        }

        // 插入新元素
        elems[i + 1] = x;
        usedSize++;
    }



//    实现顺序表节点循环右移k位
//    例如: [1, 2, 3, 4, 5, 6]  右移 2 位  [5, 6, 1, 2, 3, 4].
    public static int[] revolveRight1(int[] arr, int k) {
        int usedSize = arr.length;

        if (usedSize == 0 || k == 0) {
            return arr; // 数组为空 / k为0时不需要移动
        }

        if (k < 0) {
            throw new IllegalArgumentException("无效参数: " + k);
        }

        k = k % usedSize;// 取余, 处理k大于数组长度的情况

        int[] a = new int[usedSize];
        int n = usedSize - k;

        // 将原数组的后k个元素放到新数组的前面
        for (int i = 0; i < k; i++) {
            a[i] = arr[n + i];
        }

        // 将元素前n个元素移动到临时数组的后面
        for (int i = 0; i < n; i++) {
            a[k + i] = arr[i];
        }
        return a;// 返回新的数组
    }

    public static int[] revolveRight(int[] arr, int k) {
        int usedSize = arr.length;
        if (usedSize == 0 || k == 0) {
            return arr;
        }

        if (k < 0) {
            throw new IllegalArgumentException("无效参数: " + k);
        }


        k = k % usedSize; // 取余, 处理k大于数组长度的情况

        // 重复k次将最后一个元素移动到数组的开始
        for (int j = 0; j < k; j++) {
            // 取最后一个元素
            int tmp = arr[usedSize - 1];
            // 将所有元素向后移动一位
            for (int i = usedSize - 1; i > 0; i--) {
                arr[i] = arr[i - 1];
            }
            // 将取出的最后一个元素放到数组的开始
            arr[0] = tmp;
        }
        return arr;
    }


    //    实现逆序
    public void reserve(){
        int left = 0;
        int right = usedSize-1;
        while(right > left){
            int temp = elems[left]; //辅助节点
            elems[left] = elems[right];
            elems[right] = temp;
            left++;
            right--;
        }
    }
}
